#include "acceptor.h"
#include <cassert>

namespace net {

Acceptor::Acceptor(EventLoop* loop, int port)
    : _socket(createServer(port)),
      _loop(loop),
      _acceptChannel(loop, _socket.fd()) 
{
    // 设置读事件回调函数
    _acceptChannel.setReadCallback(std::bind(&Acceptor::handleRead, this));
}

Acceptor::~Acceptor() 
{
    _acceptChannel.disableAll();    // 从Poller中把感兴趣的事件删除掉
    _acceptChannel.remove();        // 把Poller的ChannelMap对应的部分删除
}

void Acceptor::listen() 
{
    // 启用读事件监听
    _acceptChannel.enableReading();
}

int Acceptor::createServer(int port) 
{
    // 创建服务器套接字
    bool ret = _socket.createServer(port);
    assert(ret);
    return _socket.fd();
}

void Acceptor::handleRead() 
{
    // 接受新连接
    int connfd = _socket.accept();
    if (connfd < 0) 
    {
        LOG_ERROR("Failed to accept connection");
        return;
    }

    // 调用回调函数处理新连接
    if (_callback) 
    {
        _callback(connfd);
    } 
    else 
    {
        // 没有设置回调函数，关闭连接
        ::close(connfd);
        LOG_WARN("No accept callback set, closing connection");
    }
}

} // namespace net